{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 2层神经网络的类\n",
    "\n",
    "import sys, os\n",
    "sys.path.append(os.pardir)\n",
    "from common import gradient\n",
    "from common.layers import *\n",
    "from collections import OrderedDict\n",
    "\n",
    "class TwoLayerNet:\n",
    "    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):\n",
    "        \"\"\"\n",
    "        初始化权重\n",
    "        :param input_size:  输入层节点数量\n",
    "        :param hidden_size: 隐藏层节点数量\n",
    "        :param output_size: 输出层节点数量\n",
    "        :param weight_init_std: 初始化权重系数\n",
    "        \"\"\"\n",
    "        self.params = {}\n",
    "        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)\n",
    "        self.params['b1'] = np.zeros(hidden_size)\n",
    "        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)\n",
    "        self.params['b2'] = np.zeros(output_size)\n",
    "\n",
    "        # 生成层\n",
    "        self.layers = OrderedDict()\n",
    "        self.layers['Affine1'] = Affine(self.params['W1'], self.params['b1'])\n",
    "        self.layers['Relu1'] = Relu()\n",
    "        self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2'])\n",
    "        self.lastLayer = SoftmaxWithLoss()\n",
    "\n",
    "    def predict(self, x):\n",
    "        \"\"\"\n",
    "        推理方法\n",
    "        :param x:   输入数据\n",
    "        :return:    推理结果\n",
    "        \"\"\"\n",
    "        for layer in self.layers.values():\n",
    "            x = layer.forward(x)\n",
    "        return x\n",
    "\n",
    "    def loss(self, x, t):\n",
    "        \"\"\"\n",
    "        损失函数\n",
    "        :param x: 输入数据\n",
    "        :param t: 监督数据\n",
    "        :return:  损失函数值\n",
    "        \"\"\"\n",
    "        y = self.predict(x)\n",
    "        return self.lastLayer.forward(y, t)\n",
    "\n",
    "    def accuracy(self, x, t):\n",
    "        \"\"\"\n",
    "        统计精确度\n",
    "        :param x: 输入数据\n",
    "        :param t: 监督数据\n",
    "        :return:  正确率\n",
    "        \"\"\"\n",
    "        y = self.predict(x)\n",
    "        y = np.argmax(y, axis=1)\n",
    "\n",
    "        if t.ndim != 1:\n",
    "            t = np.argmax(t, axis=1)\n",
    "\n",
    "        accuracy = np.sum(y == t) / float(x.shape[0])\n",
    "        return accuracy\n",
    "\n",
    "    def numerical_gradient(self, x, t):\n",
    "        \"\"\"\n",
    "        梯度计算-数值微分算法\n",
    "        :param x:   输入数据\n",
    "        :param t:   监督数据\n",
    "        :return:    梯度字典\n",
    "        \"\"\"\n",
    "        loss_W = lambda W: self.loss(x, t)\n",
    "        grads = {}\n",
    "        grads['W1'] = gradient.numerical_gradient(loss_W, self.params['W1'])\n",
    "        grads['b1'] = gradient.numerical_gradient(loss_W, self.params['b1'])\n",
    "        grads['W2'] = gradient.numerical_gradient(loss_W, self.params['W2'])\n",
    "        grads['b2'] = gradient.numerical_gradient(loss_W, self.params['b2'])\n",
    "        return grads\n",
    "\n",
    "    def gradient(self, x, t):\n",
    "        \"\"\"\n",
    "        梯度计算-误差反向传播算法\n",
    "        :param x:\n",
    "        :param t:\n",
    "        :return:\n",
    "        \"\"\"\n",
    "        # forward\n",
    "        self.loss(x, t)\n",
    "\n",
    "        # backward\n",
    "        dout = 1\n",
    "        dout = self.lastLayer.backward(dout)\n",
    "\n",
    "        layers = list(self.layers.values())\n",
    "        layers.reverse()\n",
    "\n",
    "        for layer in layers:\n",
    "            dout = layer.backward(dout)\n",
    "\n",
    "        # grad dict\n",
    "        grads = {}\n",
    "        grads['W1'] = self.layers['Affine1'].dW\n",
    "        grads['b1'] = self.layers['Affine1'].db\n",
    "        grads['W2'] = self.layers['Affine2'].dW\n",
    "        grads['b2'] = self.layers['Affine2'].db\n",
    "\n",
    "        return grads"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W1:4.865993546972601e-10\n",
      "b1:2.778899803063811e-09\n",
      "W2:6.454498077931089e-09\n",
      "b2:1.3975300141855217e-07\n"
     ]
    }
   ],
   "source": [
    "# 梯度确认\n",
    "\n",
    "import numpy as np\n",
    "from dataset.mnist import load_mnist\n",
    "\n",
    "# 加载训练数据\n",
    "(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=True)\n",
    "\n",
    "network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)\n",
    "\n",
    "x_batch = x_train[:3]\n",
    "t_batch = t_train[:3]\n",
    "\n",
    "grad_numerical = network.numerical_gradient(x_batch, t_batch)\n",
    "grad_backprop = network.gradient(x_batch, t_batch)\n",
    "\n",
    "for key in grad_backprop.keys():\n",
    "    diff = np.average(np.abs(grad_backprop[key] - grad_numerical[key]))\n",
    "    print(key + \":\" + str(diff))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 train acc, test acc |0.09223333333333333, 0.0869\n",
      "600 train acc, test acc |0.9009, 0.9075\n",
      "1200 train acc, test acc |0.9215166666666667, 0.9256\n",
      "1800 train acc, test acc |0.9358666666666666, 0.9373\n",
      "2400 train acc, test acc |0.9450333333333333, 0.9451\n",
      "3000 train acc, test acc |0.9503666666666667, 0.9483\n",
      "3600 train acc, test acc |0.9577, 0.9547\n",
      "4200 train acc, test acc |0.9630333333333333, 0.9598\n",
      "4800 train acc, test acc |0.9663, 0.9619\n",
      "5400 train acc, test acc |0.9695166666666667, 0.9652\n",
      "6000 train acc, test acc |0.9706666666666667, 0.9656\n",
      "6600 train acc, test acc |0.9729666666666666, 0.9674\n",
      "7200 train acc, test acc |0.9745333333333334, 0.969\n",
      "7800 train acc, test acc |0.9777333333333333, 0.9707\n",
      "8400 train acc, test acc |0.9783, 0.9708\n",
      "9000 train acc, test acc |0.98055, 0.971\n",
      "9600 train acc, test acc |0.9804833333333334, 0.9735\n",
      "10200 train acc, test acc |0.98125, 0.9736\n",
      "10800 train acc, test acc |0.9829333333333333, 0.9741\n",
      "11400 train acc, test acc |0.9830833333333333, 0.974\n",
      "12000 train acc, test acc |0.9829333333333333, 0.9718\n",
      "12600 train acc, test acc |0.98455, 0.9739\n",
      "13200 train acc, test acc |0.98505, 0.9735\n",
      "13800 train acc, test acc |0.9860833333333333, 0.9735\n",
      "14400 train acc, test acc |0.9868833333333333, 0.975\n",
      "15000 train acc, test acc |0.9861166666666666, 0.9738\n",
      "15600 train acc, test acc |0.9883666666666666, 0.975\n",
      "16200 train acc, test acc |0.9881833333333333, 0.9746\n",
      "16800 train acc, test acc |0.9885, 0.9756\n",
      "17400 train acc, test acc |0.98955, 0.9756\n",
      "18000 train acc, test acc |0.9893333333333333, 0.9747\n",
      "18600 train acc, test acc |0.9898333333333333, 0.9764\n",
      "19200 train acc, test acc |0.9907833333333333, 0.9747\n",
      "19800 train acc, test acc |0.9913333333333333, 0.9753\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABDFElEQVR4nO3dd3zU9eHH8fclkACSBBCSgARERFBAloJBiwMqILXa9qdUsah1F1ot1oELtVVwYmtRXIgLGQ6ogCh7hkRG2CsQCCMLQvbOfX5/JLnckcuC5L5J7vV8PPLg8r3Pfe/zzUG+bz7TZowxAgAAsIiP1RUAAADejTACAAAsRRgBAACWIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALBUE6srUB12u10nTpxQQECAbDab1dUBAADVYIxRRkaGOnToIB+fits/GkQYOXHihMLCwqyuBgAAOAtHjx5Vx44dK3y+QYSRgIAAScUXExgYaHFtAABAdaSnpyssLMxxH69IgwgjpV0zgYGBhBEAABqYqoZYMIAVAABYijACAAAsRRgBAACWIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALAUYQQAAFiKMAIAACxFGAEAAJYijAAAAEt5dRj5cuMRjZ+1RSdSc6yuCgAAXqtB7NpbV56bv1OS1C7AX5Nu7mlxbQAA8E5e3TJS6tP1h62uAgAAXsurw8iInqFWVwEAAK/n1WHkhh7BVlcBAACv59VhpE9YK6urAACA1/PqMNKqRVNJko/N4ooAAODFvDqM+PkWX77dSIVFdotrAwCAd/LuMNKk7PLzCSMAAFiCMFIiv5AwAgCAFbw6jDTxsclWMl6EMAIAgDW8OozYbDbHuJE8wggAAJbw6jAilXXVMGYEAABreH0Y8S8NI7SMAABgCa8PI6XdNIQRAACsQRihmwYAAEsRRuimAQDAUl4fRvYnZkqSDp/KsrgmAAB4J68PI6Wem7/T6ioAAOCVCCMlmjf1tboKAAB4Ja8PI6Wzaf42tJvFNQEAwDt5fRi5vkc7SVJAsyYW1wQAAO/k9WHEp2RzGrvdWFwTAAC8E2HEpziMFBFGAACwBGGktGWELAIAgCW8Poz4FmcR2Q1pBAAAK3h9GClrGSGMAABgBcKIY8yIxRUBAMBLEUbopgEAwFJeH0Z8fZjaCwCAlbw+jNiYTQMAgKW8Poz4loSRIrppAACwhNeHEceYEZpGAACwBGHEh6m9AABYyevDCN00AABYy+vDSGnLCFkEAABrEEZsbJQHAICVCCMsegYAgKW8Poyw6BkAANby+jDComcAAFjL68MIs2kAALBWjcLI5MmTdeWVVyogIEDBwcG69dZbtW/fvipfN2/ePPXo0UPNmjVT7969tXjx4rOucG1buidBkjQrMs7imgAA4J1qFEZWr16tcePGaePGjVq6dKkKCgp04403Kisrq8LXbNiwQXfccYfuu+8+bd26VbfeeqtuvfVW7dy585wrXxt2Hk+3ugoAAHg1mzFn3z+RnJys4OBgrV69WkOGDHFbZvTo0crKytLChQsdx6666ir17dtX06dPr9b7pKenKygoSGlpaQoMDDzb6rp14dOLHI8PTxlVq+cGAMCbVff+fU5jRtLS0iRJbdq0qbBMRESEhg0b5nJs+PDhioiIOJe3BgAAjcRZhxG73a7HHntMV199tXr16lVhuYSEBIWEhLgcCwkJUUJCQoWvycvLU3p6ustXXflVt7Z1dm4AAFC1sw4j48aN086dOzV79uzarI+k4oGyQUFBjq+wsLBaf49SN15WHJRG9gqts/cAAAAVO6swMn78eC1cuFArV65Ux44dKy0bGhqqxMREl2OJiYkKDa345j9x4kSlpaU5vo4ePXo21ayWzUdOS5J+3FlxSw0AAKg7NQojxhiNHz9e33//vVasWKEuXbpU+Zrw8HAtX77c5djSpUsVHh5e4Wv8/f0VGBjo8lVX5kefqLNzAwCAqjWpSeFx48Zp1qxZWrBggQICAhzjPoKCgtS8eXNJ0tixY3XBBRdo8uTJkqRHH31U1157rd566y2NGjVKs2fP1qZNm/Thhx/W8qUAAICGqEYtI++//77S0tJ03XXXqX379o6vOXPmOMrExcUpPj7e8f3gwYM1a9Ysffjhh+rTp4+++eYbzZ8/v9JBrwAAwHvUqGWkOkuSrFq1qtyx2267TbfddltN3goAAHgJr9+bJqBZjfIYAACoZV4fRp696VJJUqsWTS2uCQAA3snrw0hg8+IQcklIgMU1AQDAO3l9GLGV/HkOW/QAAIBzQBgpSSNkEQAArOH1YaS0bYQsAgCANbw+jJS1jBBHAACwgteHER8bLSMAAFjJ68NI6QBWO2kEAABLEEbKptNYWg8AALwV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iY6ONjfddJPp1KmTyczMdJS59tprzQMPPGDi4+MdX2lpaY7nCwsLTa9evcywYcPM1q1bzeLFi03btm3NxIkTHWUOHTpkWrRoYSZMmGB2795t3n33XePr62uWLFlS59c4adIk07NnT5f6JycnO55/+OGHTVhYmFm+fLnZtGmTueqqq8zgwYMbzPUlJSW5XNvSpUuNJLNy5UpjTMP7/BYvXmyeffZZ89133xlJ5vvvv3d5fsqUKSYoKMjMnz/fbNu2zfz2t781Xbp0MTk5OY4yI0aMMH369DEbN240a9euNRdffLG54447HM+npaWZkJAQM2bMGLNz507z9ddfm+bNm5sPPvjAUWb9+vXG19fXvP7662b37t3mueeeM02bNjU7duyo02tMTU01w4YNM3PmzDF79+41ERERZuDAgWbAgAEu5+jcubN5+eWXXT5X53+3Vl5jVZ/h3XffbUaMGOFS95SUFJcy9fkzrOr6nK8rPj7ezJgxw9hsNnPw4EFHmfr8+VXnvuCp35u1dS/12jAycOBAM27cOMf3RUVFpkOHDmby5MkW1qpqSUlJRpJZvXq149i1115rHn300Qpfs3jxYuPj42MSEhIcx95//30TGBho8vLyjDHGPPnkk6Znz54urxs9erQZPnx47V6AG5MmTTJ9+vRx+1xqaqpp2rSpmTdvnuPYnj17jCQTERFhjKn/13emRx991HTt2tXY7XZjTMP+/M78RW+3201oaKh54403HMdSU1ONv7+/+frrr40xxuzevdtIMr/88oujzI8//mhsNps5fvy4McaY9957z7Ru3dpxfcYY89RTT5nu3bs7vr/99tvNqFGjXOozaNAg89BDD9XpNboTFRVlJJkjR444jnXu3NlMnTq1wtfUl2usKIzccsstFb6mIX2G1fn8brnlFnPDDTe4HGson58x5e8Lnvy9WVv3Uq/spsnPz9fmzZs1bNgwxzEfHx8NGzZMERERFtasamlpaZKkNm3auBz/6quv1LZtW/Xq1UsTJ05Udna247mIiAj17t1bISEhjmPDhw9Xenq6du3a5Sjj/PMoLeOpn8eBAwfUoUMHXXTRRRozZozi4uIkSZs3b1ZBQYFL3Xr06KFOnTo56tYQrq9Ufn6+vvzyS/35z3922fSxoX9+pWJjY5WQkOBSl6CgIA0aNMjl82rVqpWuuOIKR5lhw4bJx8dHkZGRjjJDhgyRn5+fo8zw4cO1b98+nT592lGmPlyzVPzv0mazqVWrVi7Hp0yZovPPP1/9+vXTG2+84dIEXt+vcdWqVQoODlb37t31yCOP6NSpUy51byyfYWJiohYtWqT77ruv3HMN5fM7877gqd+btXkvbRAb5dW2kydPqqioyOVDkKSQkBDt3bvXolpVzW6367HHHtPVV1+tXr16OY7feeed6ty5szp06KDt27frqaee0r59+/Tdd99JkhISEtxea+lzlZVJT09XTk6OmjdvXmfXNWjQIM2cOVPdu3dXfHy8XnrpJf3qV7/Szp07lZCQID8/v3K/5ENCQqqse+lzlZXxxPU5mz9/vlJTU3XPPfc4jjX0z89ZaX3c1cW5rsHBwS7PN2nSRG3atHEp06VLl3LnKH2udevWFV5z6Tk8JTc3V0899ZTuuOMOl03G/va3v6l///5q06aNNmzYoIkTJyo+Pl5vv/224zrq6zWOGDFCv//979WlSxcdPHhQzzzzjEaOHKmIiAj5+vo2qs/ws88+U0BAgH7/+9+7HG8on5+7+4Knfm+ePn261u6lXhlGGqpx48Zp586dWrduncvxBx980PG4d+/eat++vYYOHaqDBw+qa9eunq5mjY0cOdLx+PLLL9egQYPUuXNnzZ0712M3UU/55JNPNHLkSHXo0MFxrKF/ft6soKBAt99+u4wxev/9912emzBhguPx5ZdfLj8/Pz300EOaPHlyvV9W/I9//KPjce/evXX55Zera9euWrVqlYYOHWphzWrfjBkzNGbMGDVr1szleEP5/Cq6LzQ0XtlN07ZtW/n6+pYbWZyYmKjQ0FCLalW58ePHa+HChVq5cqU6duxYadlBgwZJkmJiYiRJoaGhbq+19LnKygQGBno8ELRq1UqXXHKJYmJiFBoaqvz8fKWmpparW1V1L32usjKevL4jR45o2bJluv/++yst15A/v9L6VPZvKzQ0VElJSS7PFxYWKiUlpVY+U0/9Gy4NIkeOHNHSpUur3Hp90KBBKiws1OHDhyU1jGssddFFF6lt27Yufycbw2e4du1a7du3r8p/k1L9/Pwqui946vdmbd5LvTKM+Pn5acCAAVq+fLnjmN1u1/LlyxUeHm5hzcozxmj8+PH6/vvvtWLFinLNgu5ER0dLktq3by9JCg8P144dO1x+eZT+8rzsssscZZx/HqVlrPh5ZGZm6uDBg2rfvr0GDBigpk2butRt3759iouLc9StoVzfp59+quDgYI0aNarScg358+vSpYtCQ0Nd6pKenq7IyEiXzys1NVWbN292lFmxYoXsdrsjiIWHh2vNmjUqKChwlFm6dKm6d++u1q1bO8pYdc2lQeTAgQNatmyZzj///CpfEx0dLR8fH0f3Rn2/RmfHjh3TqVOnXP5ONvTPUCpuqRwwYID69OlTZdn69PlVdV/w1O/NWr2X1mi4ayMye/Zs4+/vb2bOnGl2795tHnzwQdOqVSuXkcX1wSOPPGKCgoLMqlWrXKaYZWdnG2OMiYmJMS+//LLZtGmTiY2NNQsWLDAXXXSRGTJkiOMcpVO4brzxRhMdHW2WLFli2rVr53YK1xNPPGH27Nljpk2b5rGpr48//rhZtWqViY2NNevXrzfDhg0zbdu2NUlJScaY4ilqnTp1MitWrDCbNm0y4eHhJjw8vMFcnzHFI8w7depknnrqKZfjDfHzy8jIMFu3bjVbt241kszbb79ttm7d6phJMmXKFNOqVSuzYMECs337dnPLLbe4ndrbr18/ExkZadatW2e6devmMi00NTXVhISEmD/96U9m586dZvbs2aZFixblpk02adLEvPnmm2bPnj1m0qRJtTa1t7JrzM/PN7/97W9Nx44dTXR0tMu/y9JZCBs2bDBTp0410dHR5uDBg+bLL7807dq1M2PHjq0X11jZ9WVkZJh//OMfJiIiwsTGxpply5aZ/v37m27dupnc3FzHOerzZ1jV31FjiqfmtmjRwrz//vvlXl/fP7+q7gvGeO73Zm3dS702jBhjzLvvvms6depk/Pz8zMCBA83GjRutrlI5ktx+ffrpp8YYY+Li4syQIUNMmzZtjL+/v7n44ovNE0884bJOhTHGHD582IwcOdI0b97ctG3b1jz++OOmoKDApczKlStN3759jZ+fn7nooosc71HXRo8ebdq3b2/8/PzMBRdcYEaPHm1iYmIcz+fk5Ji//OUvpnXr1qZFixbmd7/7nYmPj3c5R32+PmOM+emnn4wks2/fPpfjDfHzW7lypdu/k3fffbcxpnh67/PPP29CQkKMv7+/GTp0aLnrPnXqlLnjjjtMy5YtTWBgoLn33ntNRkaGS5lt27aZa665xvj7+5sLLrjATJkypVxd5s6day655BLj5+dnevbsaRYtWlTn1xgbG1vhv8vStWM2b95sBg0aZIKCgkyzZs3MpZdeal599VWXm7mV11jZ9WVnZ5sbb7zRtGvXzjRt2tR07tzZPPDAA+VuLvX5M6zq76gxxnzwwQemefPmJjU1tdzr6/vnV9V9wRjP/t6sjXupreTCAAAALOGVY0YAAED9QRgBAACWIowAAABLEUYAAIClCCMAAMBShBEAAGApwggAALAUYQQAAFiKMAIAACxFGAEAAJYijAAAAEsRRgAAgKX+Hxk3DnWPA2f2AAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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wqwxAgBA3hFGcpAsYC1jWi8AAHlDGMlBeCARRphJAwBA3hBGchCOxIdpygOEEQAA8oUwkoNkAWspBawAAOQNYSQHfYkCVqb2AgCQP4SRHKR7RggjAADkC2EkB+lFzximAQAgXwgjOQglCljLKGAFACBvziiMbNy4UfX19SopKVFDQ4N27Nhx2v03bNigCy+8UKWlpaqrq9Mdd9yh/v7+M2qwm5jaCwBA/uUcRjZv3qzm5matW7dOu3bt0vz587Vo0SIdPnx42P1//vOfa/Xq1Vq3bp1ef/11/fSnP9XmzZv11a9+9V033mnhVM8IwzQAAORLzmFk/fr1WrlypVasWKGLL75YmzZtUllZmR566KFh9//973+vK6+8UjfeeKPq6+t17bXX6jOf+cyovSlno/S9aegZAQAgX3IKI9FoVDt37lRTU1P6B3i9ampqUltb27Dv+cAHPqCdO3emwsfbb7+tp59+Wh/96EdH/D2RSETBYDDjcTaggBUAgPzL6ara3d2tWCym6urqjO3V1dV64403hn3PjTfeqO7ubv31X/+1jDEaHBzULbfcctphmpaWFt199925NM0RocQ6I0ztBQAgf2yfTbNt2zbde++9+rd/+zft2rVLTzzxhLZs2aJ77rlnxPesWbNGPT09qcf+/fvtbmZW6BkBACD/crqqVlVVyefzqaurK2N7V1eXpk2bNux77rrrLt100036whe+IEm65JJLFAqFdPPNN+trX/uavN5T81AgEFAgEMilaY5gai8AAPmXU8+I3+/XggUL1NramtpmWZZaW1vV2Ng47HvC4fApgcPni1/MjTG5ttdVfQMUsAIAkG85jzc0Nzdr+fLluvzyy7Vw4UJt2LBBoVBIK1askCQtW7ZMtbW1amlpkSQtWbJE69ev1/ve9z41NDRo7969uuuuu7RkyZJUKDkXRActDcTi4amMYRoAAPIm56vq0qVLdeTIEa1du1adnZ269NJLtXXr1lRRa0dHR0ZPyNe//nV5PB59/etf14EDBzRlyhQtWbJE3/72t/P3r3BAOFG8KtEzAgBAPnnMOTBWEgwGVVlZqZ6eHlVUVLjShoPH+/SB+56T3+fVm99e7EobAAA4l2R7/ebeNFkKM60XAABbEEayFE5N6yWMAACQT4SRLIUiiZk03JcGAIC8IoxkqW8gscYIPSMAAOQVYSRLqZ4RwggAAHlFGMlSsoCVNUYAAMgvwkiWkgWs9IwAAJBfhJEshblJHgAAtiCMZIl1RgAAsAdhJEvJAtZy7tgLAEBeEUay1JeqGWGYBgCAfCKMZCkUZZ0RAADsQBjJErNpAACwB2EkS6wzAgCAPQgjWUpN7aWAFQCAvCKMZCkZRkqL6RkBACCfCCNZCkfiwzT0jAAAkF+EkSyFKGAFAMAWhJEssc4IAAD2IIxkYSBmKRqzJNEzAgBAvhFGspAsXpXoGQEAIN8II1lIrjFS7PPIX8QhAwAgn7iyZiE9rZchGgAA8o0wkoVw6o69DNEAAJBvhJEsJG+SV0rxKgAAeUcYyUJyWm85xasAAOQdYSQL9IwAAGAfwkgWUjfJI4wAAJB3hJEsJO9LU0YBKwAAeUcYyUJ4ILEUPFN7AQDIO8JIFpjaCwCAfQgjWaCAFQAA+xBGstBHASsAALYhjGQhlFwOnnVGAADIO8JIFvoSwzT0jAAAkH+EkSyEEgWsTO0FACD/CCNZYGovAAD2IYxkIb3oGWEEAIB8I4xkIbkcfBkFrAAA5B1hJAthClgBALANYSQL6am9hBEAAPKNMDKKwZil6KAlSSpnmAYAgLwjjIwiOZNGooAVAAA7EEZGkVwK3uf1yO/jcAEAkG9cXUcRSk7r9fvk8Xhcbg0AAGMPYWQU6Wm9DNEAAGAHwsgowqk79lK8CgCAHQgjowgl1hhhWi8AAPYgjIyij54RAABsRRgZRYj70gAAYCvCyCj6BihgBQDAToSRUYQi3CQPAAA7EUZGkbxJHj0jAADYgzAyivQ6I/SMAABgB8LIKOgZAQDAXoSRUbACKwAA9iKMjCJZwFoeYJgGAAA7EEZGwTANAAD2IoyMggJWAADsRRgZBT0jAADYizAyCgpYAQCwF2FkFAzTAABgL8LIKBimAQDAXoSR04hZRv0DliSm9gIAYJczCiMbN25UfX29SkpK1NDQoB07dpx2/+PHj2vVqlWaPn26AoGALrjgAj399NNn1GAnJXtFJHpGAACwS84f9zdv3qzm5mZt2rRJDQ0N2rBhgxYtWqQ9e/Zo6tSpp+wfjUb1kY98RFOnTtXjjz+u2tpa/fnPf9aECRPy0X5b9SXqRbweKVBEJxIAAHbIOYysX79eK1eu1IoVKyRJmzZt0pYtW/TQQw9p9erVp+z/0EMP6dixY/r973+v4uJiSVJ9ff27a7VDQkOKVz0ej8utAQBgbMrp4340GtXOnTvV1NSU/gFer5qamtTW1jbse/7rv/5LjY2NWrVqlaqrqzV37lzde++9isViI/6eSCSiYDCY8XADxasAANgvpzDS3d2tWCym6urqjO3V1dXq7Owc9j1vv/22Hn/8ccViMT399NO666679L3vfU/f+ta3Rvw9LS0tqqysTD3q6upyaWbeJKf1UrwKAIB9bC+EsCxLU6dO1Y9//GMtWLBAS5cu1de+9jVt2rRpxPesWbNGPT09qcf+/fvtbuawkmGktJieEQAA7JLTR/6qqir5fD51dXVlbO/q6tK0adOGfc/06dNVXFwsny99QX/Pe96jzs5ORaNR+f3+U94TCAQUCARyaZotwpH4ME15gDACAIBdcuoZ8fv9WrBggVpbW1PbLMtSa2urGhsbh33PlVdeqb1798qyrNS2N998U9OnTx82iJxNkgWspay+CgCAbXIepmlubtaDDz6on/3sZ3r99dd16623KhQKpWbXLFu2TGvWrEntf+utt+rYsWO6/fbb9eabb2rLli269957tWrVqvz9K2zSlyhgLaeAFQAA2+T8kX/p0qU6cuSI1q5dq87OTl166aXaunVrqqi1o6NDXm8649TV1emZZ57RHXfcoXnz5qm2tla333677rzzzvz9K2yS7hkhjAAAYBePMca43YjRBINBVVZWqqenRxUVFY793vXPvqkftL6lm94/S/fcMNex3wsAwFiQ7fWbZUVPI1nAWkYBKwAAtiGMnEZ4ILECazEFrAAA2IUwchpM7QUAwH6EkdOggBUAAPsRRk4jedfectYZAQDANoSR0wgl1hmhZwQAAPsQRk6DnhEAAOxHGDmNZM8IU3sBALAPYeQ0kj0jZQzTAABgG8LIaYQiDNMAAGA3wsgILMuob4CpvQAA2I0wMoJkEJHoGQEAwE6EkREki1c9HqmkmMMEAIBduMqOIFW8WuyTx+NxuTUAAIxdhJERJItXywIM0QAAYCfCyAj6BhJrjFC8CgCArQgjI0j1jFC8CgCArQgjIwhH6RkBAMAJhJERhFl9FQAARxBGRhAijAAA4AjCyAj6EsM0LHgGAIC9CCMjSE/tpWcEAAA7EUZGkFwOntk0AADYizAyglCE2TQAADiBMDICZtMAAOAMwsgI0uuMMEwDAICdCCMjoGcEAABn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AKedURjZuHGj6uvrVVJSooaGBu3YsWPEfR988EFdddVVmjhxoiZOnKimpqbT7u+GPqb2AgDgmpzDyObNm9Xc3Kx169Zp165dmj9/vhYtWqTDhw8Pu/+2bdv0mc98Rs8//7za2tpUV1ena6+9VgcOHHjXjc+XUCKMsOgZAADO8xhjTC5vaGho0BVXXKEHHnhAkmRZlurq6vTFL35Rq1evHvX9sVhMEydO1AMPPKBly5Zl9TuDwaAqKyvV09OjioqKXJqblSvve04HjvfpqVVXan7dhLz/fAAAClG21++cekai0ah27typpqam9A/wetXU1KS2trasfkY4HNbAwIAmTZo04j6RSETBYDDjYadQatEzekYAAHBaTmGku7tbsVhM1dXVGdurq6vV2dmZ1c+48847VVNTkxFoTtbS0qLKysrUo66uLpdm5iy16Bk3ygMAwHGOzqa577779Oijj+rJJ59USUnJiPutWbNGPT09qcf+/ftta9NAzFJ00JJEASsAAG7IqSugqqpKPp9PXV1dGdu7uro0bdq00773u9/9ru677z799re/1bx58067byAQUCAQyKVpZyzZKyJRwAoAgBty6hnx+/1asGCBWltbU9ssy1Jra6saGxtHfN/999+ve+65R1u3btXll19+5q21QXJab5HXI7+PZVcAAHBazkUSzc3NWr58uS6//HItXLhQGzZsUCgU0ooVKyRJy5YtU21trVpaWiRJ//Iv/6K1a9fq5z//uerr61O1JePGjdO4cePy+E85M+kFz3zyeDwutwYAgMKTcxhZunSpjhw5orVr16qzs1OXXnqptm7dmipq7ejokNeb7mH40Y9+pGg0qr/927/N+Dnr1q3TN77xjXfX+jxIL3hG8SoAAG44oyvwbbfdpttuu23Y17Zt25bx/TvvvHMmv8IxoQjTegEAcFPBF0mk7tjLTfIAAHAFYSSSCCMM0wAA4IqCDyOsvgoAgLsKPoxQwAoAgLsKPowMndoLAACcV/BhJN0zQhgBAMANBR9GQokC1lKGaQAAcEXBh5FwYpiGnhEAANxBGIkm1xmhZwQAADcQRpjaCwCAqwgjyZ4RwggAAK4o+DASirICKwAAbir4MNJHASsAAK4q+DCSntpLGAEAwA0FH0ZSU3uZTQMAgCsIIxSwAgDgqoIOIzHLKDJoSaKAFQAAtxR0GEkO0Uj0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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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ysvL1dzcrF27do34/I0bN2r27NmqqKhQU1OT7rjjDvX3949pwE4a/GwayjQAABRLwWFk69atamtr0/r167Vnzx7Nnz9fS5Ys0dGjR3M+/2c/+5nuuusurV+/Xm+//bZ++tOfauvWrbr77rvPePB2C2c+tZeZEQAAiqXgMLJhwwatXr1aq1at0mWXXabNmzersrJSW7Zsyfn8l19+WVdddZVuuOEGzZgxQ9dee62+8pWvjDqbcjaitRcAgOIrKIxEo1Ht3r1bra2tg2/gdqu1tVUdHR05X/Mnf/In2r17dyZ8vPfee3r66af153/+58P+nEgkokAgkHU7GwyuGaFMAwBAsRR0Vu3p6VE8HldDQ0PW9oaGBu3duzfna2644Qb19PToT//0T2WM0cDAgG6++eYRyzTt7e267777ChmaLQZbe5kZAQCgWCzvptmxY4fuv/9+/fjHP9aePXv061//Wk899ZS+973vDfuatWvXqre3N3M7fPiw1cPMC900AAAUX0EzI/X19fJ4POru7s7a3t3drcbGxpyvuffee/XVr35VX//61yVJl19+uYLBoG666Sbdc889crtPz0N+v19+v7+QoVkunjCKDCQkUaYBAKCYCpoZ8fl8WrRokbZv357ZlkgktH37drW0tOR8TSgUOi1weDzJmQVjTKHjdUy6RCMxMwIAQDEV/Cd+W1ubVq5cqSuvvFKLFy/Wxo0bFQwGtWrVKknSihUrNHXqVLW3t0uSli1bpg0bNmjhwoVqbm7W/v37de+992rZsmWZUHIuSLf1ul2S38u14gAAKJaCw8jy5ct17NgxrVu3Tl1dXVqwYIG2bduWWdR66NChrJmQb3/723K5XPr2t7+tDz/8UBMnTtSyZcv093//98X7V9hgaCeNy+VyeDQAAJw/XOYcqJUEAgHV1taqt7dXNTU1jozhdx/16vM/fEkTq/36v/e0jv4CAABKXL7nb+oNeQrTSQMAgCUII3nigmcAAFiDMJInLngGAIA1CCN54oJnAABYgzCSJ8IIAADWIIzkKcyaEQAALEEYyVMwtWakgpkRAACKijCSp8zMSBlhBACAYiKM5CmzZsRPmQYAgGIijOQpSGsvAACWIIzkiSuwAgBgDcJInrgCKwAA1iCM5ImZEQAArEEYyROtvQAAWIMwkidaewEAsAZhJE/pNSPjaO0FAKCoCCN5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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 神经网络学习的实现\n",
    "\n",
    "import numpy as np\n",
    "from dataset.mnist import load_mnist\n",
    "from common import draw\n",
    "\n",
    "# 加载训练数据\n",
    "(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=True)\n",
    "\n",
    "# 构建神经网络对象\n",
    "network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)\n",
    "\n",
    "# 超参数\n",
    "iters_num = 20000       # 训练轮数\n",
    "train_size = x_train.shape[0]   # 训练数据量\n",
    "batch_size = 100        # 单批次数量\n",
    "learning_rate = 0.1     # 学习率\n",
    "\n",
    "# 训练数据损失函数值\n",
    "train_loss_list = []\n",
    "# 训练数据精确度\n",
    "train_acc_list = []\n",
    "# 测试数据精确度\n",
    "test_acc_list = []\n",
    "# 每个epoch重复次数\n",
    "iter_per_epoch = max(train_size / batch_size, 1)\n",
    "\n",
    "for i in range(iters_num):\n",
    "    # 获取小批量数据\n",
    "    batch_mask = np.random.choice(train_size, batch_size)\n",
    "    x_batch = x_train[batch_mask]\n",
    "    t_batch = t_train[batch_mask]\n",
    "\n",
    "    # 计算梯度\n",
    "    grad = network.gradient(x_batch, t_batch)\n",
    "\n",
    "    # 更新参数\n",
    "    for key in ('W1', 'b1', 'W2', 'b2'):\n",
    "        network.params[key] -= learning_rate * grad[key]\n",
    "\n",
    "    # 记录学习过程\n",
    "    loss = network.loss(x_batch, t_batch)\n",
    "    train_loss_list.append(loss)\n",
    "\n",
    "    # 计算每个epoch的识别精度\n",
    "    if i % iter_per_epoch == 0:\n",
    "        train_acc = network.accuracy(x_train, t_train)\n",
    "        test_acc = network.accuracy(x_test, t_test)\n",
    "        train_acc_list.append(train_acc)\n",
    "        test_acc_list.append(test_acc)\n",
    "        print(i, \"train acc, test acc |\" + str(train_acc) + \", \" + str(test_acc))\n",
    "\n",
    "draw.draw_list(train_loss_list)\n",
    "draw.draw_list(train_acc_list)\n",
    "draw.draw_list(test_acc_list)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}